package com.mh.controller;

import cn.hutool.json.JSONObject;
import com.mh.dto.R;
import com.mh.dto.bo.WxPayJsApiPreVO;
import com.mh.utils.WxPayJsApiHttpUtil;
import com.mh.utils.WxPayJsApiNotifyUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

/**
 * Date:2024/9/27
 * author:zmh
 * description: 支付相关接口
 **/

@Slf4j
@RestController
@CrossOrigin
@RequestMapping("/pay")
@RequiredArgsConstructor
public class PayController {

    // JS-API支付工具类
    private final WxPayJsApiHttpUtil wxPayJsApiHttpUtil;

    private final WxPayJsApiNotifyUtil wxPayJsApiNotifyUtil;

    /**
     * 向微信服务器创建预支付订单
     * @param openId 下单的用户OpenId
     * @return ·
     * @throws Exception ·
     */
    @GetMapping("/preOrderCreate")
    public R<WxPayJsApiPreVO> preOrderCreate(String openId) throws Exception {
        // 下单操作，并返回前端调用requestPayment函数所需的参数
        WxPayJsApiPreVO wxPayJsApiPreVO = wxPayJsApiHttpUtil.jsApiV3(openId);
        return R.success(wxPayJsApiPreVO);
    }

    /**
     * 根据位置支付订单号查询订单信息
     * @param orderNo 交易订单号
     * @return ·
     * @throws Exception ·
     */
    @GetMapping("/queryOrder/{orderNo}")
    public R<JSONObject> queryOrder(@PathVariable String orderNo) throws Exception {
        JSONObject jsonObject = wxPayJsApiHttpUtil.queryJsApiOrderInfoV3(orderNo);
        return R.success(jsonObject);
    }

    /**
     * 成功回调
     */
    @PostMapping("/notify")
    public void wxPayResult(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 微信回调此函数，取出微信支付订单号，后续可用于查单
        wxPayJsApiNotifyUtil.notifyV3(request, response);
    }
}
